#include<cstring>
#include<cstdio>
const int N=1500010,M=3000010;
inline void read(int &x){
	x=0;
	int f=1;
	char ch=getchar();
	while((ch<'0')||(ch>'9')){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while((ch>='0')&&(ch<='9')){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	x*=f;
	return;
}
int n,k,idx;
int h[N],e[M],ne[M],fa[N],dep[N],lca[20][20],len[20][20];
bool st[20];
inline void add(int a,int b){
	e[idx]=b;
	ne[idx]=h[a];
	h[a]=idx++;
	return;
}
void dfs(int u,int fa){
	::fa[u]=fa;
	dep[u]=dep[fa]+1;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==fa)
			continue;
		dfs(j,u);
	}
	return;
}
int dfs_state(int cur){
	if(cur==n+1){
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++){
				if(len[i][j]!=k)
					continue;
				int u=i,Lca=lca[i][j],cnt=st[Lca];
				while(u!=Lca){
					cnt+=st[u];
					u=fa[u];
				}
				u=j;
				while(u!=Lca){
					cnt+=st[u];
					u=fa[u];
				}
				if(cnt!=1)
					return 0;
			}
		return 1;
	}
	st[cur]=false;
	int res=dfs_state(cur+1);
	st[cur]=true;
	res+=dfs_state(cur+1);
	st[cur]=false;
	return res;
}
int main(){
	freopen("life.in","r",stdin);
	freopen("life.out","w",stdout);
	read(n);	read(k);
	memset(h,-1,sizeof h);
	for(int i=1,a,b;i<n;i++){
		read(a);	read(b);
		add(a,b);	add(b,a);
	}
	dfs(1,0);
	int max_dep=0;
	for(int i=1;i<=n;i++)
		if(max_dep<dep[i])
			max_dep=dep[i];
	if(max_dep==n){
		puts("YES");
		printf("%d\n",k);
		return 0;
	}
	if(n<=18){
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++){
				int u=i,v=j,cnt=0;
				while(u!=v){
					if(dep[u]>dep[v])
						u=fa[u];
					else
						v=fa[v];
					cnt++;
				}
				lca[i][j]=u;
				len[i][j]=cnt+1;
			}
		int t=dfs_state(1);
		if(!t){
			puts("NO");
			puts("0");
		}
		else{
			puts("YES");
			printf("%d\n",t);
		}
		return 0;
	}
	puts("NO");
	puts("0");
	return 0;
}
